package com.truth.lock.annotation;

import com.truth.lock.enumeration.TruthLockType;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * @author trth
 * 后续增加对应的派生注解，即可不用指定executor了
 */
@Target(value = ElementType.METHOD)
@Retention(value = RetentionPolicy.RUNTIME)
public @interface TruthLock {

    /**
     * @return lock 执行器类型
     */
    TruthLockType executor();

    /**
     * @return  Key生成策略
     */
    String keyGenerator() default "";

    /**
     * 默认使用包名+类名+方法名+参数，后续新增SpEL表达式支持
     * @return KEY
     */
    String key() default "";

    /**
     * @return 过期时间 单位：毫秒
     * 过期时间一定是要长于业务的执行时间. 未设置则为默认时间30秒
     */
    long expire() default 30000;

    /**
     * @return 获取锁超时时间 单位：毫秒
     * 结合业务,建议该时间不宜设置过长,特别在并发高的情况下. 未设置则为默认时间3秒
     */
    long acquireTimeout() default 3000;

    /**
     * 结合业务，调整获取锁的次数
     * @return 获取锁的次数
     */
    long acquireCount() default 4;


}
